package com.xiaoshuidi.cloud.module.member.service.user;


import com.xiaoshuidi.cloud.framework.common.pojo.PageResult;
import com.xiaoshuidi.cloud.framework.common.validation.Mobile;
import com.xiaoshuidi.cloud.module.member.api.user.dto.MemberUserAuthInfoDTO;
import com.xiaoshuidi.cloud.module.member.api.user.dto.MemberUserPageDTO;
import com.xiaoshuidi.cloud.module.member.api.user.dto.MemberUserReqDTO;
import com.xiaoshuidi.cloud.module.member.api.user.dto.MemberUserRespDTO;
import com.xiaoshuidi.cloud.module.member.api.user.dto.ThirdPayUserReqDTO;
import com.xiaoshuidi.cloud.module.member.controller.app.point.vo.UserPointInfo;
import com.xiaoshuidi.cloud.module.member.controller.app.user.vo.*;
import com.xiaoshuidi.cloud.module.member.pojo.user.MemberUser;

import java.io.InputStream;
import java.util.Collection;
import java.util.List;

/**
 * 会员用户 Service 接口
 *
 * @author 芋道源码
 */
public interface MemberUserService {

    /**
     * 通过手机查询用户
     *
     * @param mobile 手机
     * @return 用户对象
     */
    MemberUser getUserByMobile(String mobile);

    /**
     * 基于用户昵称，模糊匹配用户列表
     *
     * @param nickname 用户昵称，模糊匹配
     * @return 用户信息的列表
     */
    List<MemberUser> getUserListByNickname(String nickname);

    /**
     * 基于手机号创建用户。
     * 如果用户已经存在，则直接进行返回
     *
     * @param mobile      手机号
     * @param recommendId
     * @return 用户对象
     */
    MemberUser createUserIfAbsent(@Mobile String mobile, Long recommendId);

    /**
     * 更新用户的最后登陆信息
     *
     * @param id      用户编号
     * @param loginIp 登陆 IP
     */
    void updateUserLogin(Long id, String loginIp);

    /**
     * 通过用户 ID 查询用户
     *
     * @param id 用户ID
     * @return 用户对象信息
     */
    MemberUser getUser(Long id);

    /**
     * 通过用户 ID 查询用户们
     *
     * @param ids 用户 ID
     * @return 用户对象信息数组
     */
    List<MemberUser> getUserList(Collection<Long> ids);

    /**
     * 修改用户昵称
     *
     * @param userId   用户id
     * @param nickname 用户新昵称
     */
    void updateUserNickname(Long userId, String nickname);

    /**
     * 修改用户头像
     *
     * @param userId      用户id
     * @param inputStream 头像文件
     * @return 头像url
     */
    String updateUserAvatar(Long userId, InputStream inputStream) throws Exception;

    /**
     * 修改手机
     *
     * @param userId 用户id
     * @param reqVO  请求实体
     */
    void updateUserMobile(Long userId, AppUserUpdateMobileReqVO reqVO);

    /**
     * 判断密码是否匹配
     *
     * @param rawPassword     未加密的密码
     * @param encodedPassword 加密后的密码
     * @return 是否匹配
     */
    boolean isPasswordMatch(String rawPassword, String encodedPassword);

    boolean createUser(AppUserInfoCreateVO vo);

    /**
     * 获取会员统计信息
     *
     * @return
     */
    List<MemberUserStatisticsVO> getMemberStatistics();

    PageResult<MemberVO> getMemberPage(MemberPageReqVO memberPageReqVo);

    MemberUserRespDTO getUserInfo(MemberUserReqDTO req);

    AppUserInfoRespVO getUserInfoById(Long id);

    Boolean memberUpdateState(MemberUpdateStateVO memberUpdateStateVO);

    /**
     * RPC获取会员认证信息
     *
     * @param moible
     * @return
     */
    MemberUserAuthInfoDTO getUserAuthInfo(String moible);

    /**
     * RPC分页查询会员信息
     *
     * @param page
     * @return
     */
    PageResult<MemberUserRespDTO> getUserPage(MemberUserPageDTO page);

    /**
     * app 端编辑用户
     *
     * @param vo
     * @return
     */
    Boolean editUser(AppUserInfoCreateVO vo);

    /**
     * RPC 根据用户id集合查询用户集合
     *
     * @param ids
     * @return
     */
    List<MemberUserRespDTO> getUsersByIds(List<Long> ids);

    MemberUserRespDTO getUserById(Long id);

    List<MemberUser> getBirthDayUser();

    /**
     * 获取用户积分信息
     * @param id
     * @return
     */
    UserPointInfo getUserPointInfo(Long id);

    Boolean registerThirdMember(ThirdPayUserReqDTO thirdPayUserReqDTO);

    Boolean bindPayFlag(Long id);

    /**
     * 根据生日月份获取用户列表
     * @param month 生日月份，ex: 01  02  12
     * @return
     */
    List<MemberUser> getUserByBirthdayMonth(String month);

    /**
     * 根据证件号获取用户
     * @param cardNo
     * @return
     */
    MemberUserRespDTO getUserByCardNo(String cardNo);
}
